package com.nys.cqhttp.util;

import org.apache.commons.lang3.time.DateFormatUtils;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * 时间工具类
 *
 * @author hb
 */
public class DateUtils {
    public static String YYYY = "yyyy";

    public static String YYYY_MM = "yyyy-MM";

    public static String YYYY_MM_DD = "yyyy-MM-dd";

    public static String YYYYMMDDHHMMSS = "yyyyMMddHHmmss";

    public static String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    public static String HH_MM_SS ="HH:mm:ss";

    /**
     * 获取当前Date型日期
     *
     * @return Date() 当前日期
     */
    public static Date getNowDate() {
        return new Date();
    }

    /**
     * 获取当前日期, 默认格式为yyyy-MM-dd
     *
     * @return String
     */
    public static String getDate() {
        return dateTimeNow(YYYY_MM_DD);
    }

    public static final String getTime() {
        return dateTimeNow(YYYY_MM_DD_HH_MM_SS);
    }

    private static Map<String, EPNDateFormat> formatMap = new HashMap<String, EPNDateFormat>();
    /**
     * 获取时间戳
     *
     * @return
     */
    public static String getTimeStamp() {
        int time = (int) (System.currentTimeMillis() / 1000);
        return String.valueOf(time);
    }

    public static final String dateTimeNow() {
        return dateTimeNow(YYYYMMDDHHMMSS);
    }

    public static final String dateTimeNow(final String format) {
        return parseDateToStr(format, new Date());
    }

    public static final String dateTime(final Date date) {
        return parseDateToStr(YYYY_MM_DD, date);
    }

    public static final String parseDateToStr(final String format, final Date date) {
        return new SimpleDateFormat(format).format(date);
    }

    public static final Date dateTime(final String format, final String ts) {
        try {
            return new SimpleDateFormat(format).parse(ts);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

    /**
     * 日期路径 即年/月/日 如2018/08/08
     */
    public static final String datePath() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyy/MM/dd");
    }

    /**
     * 日期路径 即年/月/日 如20180808
     */
    public static final String dateTime() {
        Date now = new Date();
        return DateFormatUtils.format(now, "yyyyMMdd");
    }


    /**
     * 给时间加上指定的分钟
     *
     * @param date 时间
     * @param minute 分钟
     * @return
     */
    public static Date addDateMinute(Date date, int minute) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (date == null) {
            return null;
        }
        System.out.println("front:" + format.format(date)); //显示输入的日期
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MINUTE, minute);// 24小时制
        date = cal.getTime();
        System.out.println("after:" + format.format(date));  //显示更新后的日期
        cal = null;
        return date;

    }

    /**
     * 给时间加上指定的小时
     *
     * @param date 时间
     * @param hour 几小时
     * @return
     */
    public static Date addDatehour(Date date, int hour) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        if (date == null) {
            return null;
        }
        System.out.println("front:" + format.format(date)); //显示输入的日期
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.HOUR, hour);// 24小时制
        date = cal.getTime();
        System.out.println("after:" + format.format(date));  //显示更新后的日期
        cal = null;
        return date;

    }

    /**
     * 给时间加上指定的月
     *
     * @param date    时间
     * @param month   几小时
     * @param pattern
     * @return
     */
    public static String addDateMonth(Date date, int month, String pattern) {
        SimpleDateFormat format = new SimpleDateFormat(pattern);
        if (date == null) {
            return null;
        }
        System.out.println("front:" + format.format(date)); //显示输入的日期
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        cal.add(Calendar.MONTH, month);
        date = cal.getTime();
        String reDate = format.format(date);
        System.out.println("after:" + reDate);  //显示更新后的日期
        return reDate;
    }

    /**
     * 添加一年
     * @param date
     * @param year
     * @return
     */
    public static Date addYear(Date date,int year){
        Calendar calendar = new GregorianCalendar();
        calendar.setTime(date);
        calendar.add(Calendar.YEAR, year);//把日期往后增加一年.整数往后推,负数往前移动
        date = calendar.getTime();
        return date;
    }

    public static Date addDays(Date date, int days) {
        long time = date.getTime(); // 得到指定日期的毫秒数
        days = days*24*60*60*1000; // 要加上的天数转换成毫秒数
        time+=days; // 相加得到新的毫秒数
        return new Date(time); // 将毫秒数转换成日期
    }


    /**
     * @param date
     * @param date1
     * @return boolean
     * @throws
     * @Title: compareDate
     * @Description: TODO(日期比较 ， 如果s > = e 返回true 否则返回false)
     * @author luguosui
     */
    public static boolean compareDate(Date date, Date date1) {
        return date.getTime() >= date1.getTime();
    }


    public static String convert(Date date, String dateFormat) {
        if (date == null)
            return null;

        if (null == dateFormat)
            dateFormat = YYYY_MM_DD_HH_MM_SS;

        return new SimpleDateFormat(dateFormat).format(date);
    }

    /**
     * 获取两个时间相差的天数
     *
     * @param maxDate 大时间
     * @param minDate 小时间
     * @return
     */
    public static int differDays(Date maxDate, Date minDate) {
        int days = (int) ((maxDate.getTime() - minDate.getTime()) / (1000 * 60 * 60 * 24));
        return days;
    }

    /**
     * 获取今天的开始时间
     *
     * @return 时间
     */
    public static Date getNowDayStart() {
        Calendar currentDate = new GregorianCalendar();
        currentDate.set(Calendar.HOUR_OF_DAY, 0);
        currentDate.set(Calendar.MINUTE, 0);
        currentDate.set(Calendar.SECOND, 0);
        return (Date) currentDate.getTime().clone();
    }

    /**
     * 获取今天的结束时间
     *
     * @return 时间
     */
    public static Date getNowDayEnd() {
        Calendar currentDate = new GregorianCalendar();
        currentDate.set(Calendar.HOUR_OF_DAY, 23);
        currentDate.set(Calendar.MINUTE, 59);
        currentDate.set(Calendar.SECOND, 59);
        return (Date) currentDate.getTime().clone();
    }


    /**
     * 获取当前时间字符串
     *
     * @return
     */
    public static String getNow() {
        return getNow(YYYY_MM_DD_HH_MM_SS);
    }

    /**
     * 获取当前时间字符串
     * <p/>
     * 2014年7月4日 下午11:47:10 flyfox 330627517@qq.com
     *
     * @param regex 格式表达式
     * @return
     */
    public static String getNow(String regex) {
        return format(getNowDate(), regex);
    }


    /**
     * 时间对象格式化成String ,等同于java.text.SimpleDateFormat.format();
     *
     * @param date  需要格式化的时间对象
     * @param regex 定义格式的字符串
     *              <p/>
     *              2014年5月5日 下午12:00:00 flyfox 330627517@qq.com
     * @return 转化结果
     */
    public static String format(Date date, String regex) {
        return getDateFormat(regex).format(date);
    }


    private static EPNDateFormat getDateFormat(String regex) {
        EPNDateFormat fmt = formatMap.get(regex);
        if (fmt == null) {
            fmt = new EPNDateFormat(regex);
            formatMap.put(regex, fmt);
        }
        return fmt;
    }
    public static Date getDateBeginDayOfWeek() {
        Date date = new Date();
        if (date == null) {
            return null;
        }
        Calendar cal = Calendar.getInstance();
        cal.setTime(date);
        int dayofweek = cal.get(Calendar.DAY_OF_WEEK);
        if (dayofweek == 1) {
            dayofweek += 7;
        }
        cal.add(Calendar.DATE, 2 - dayofweek);
        return cal.getTime();
    }


}

class EPNDateFormat {
    private SimpleDateFormat instance;

    EPNDateFormat() {
        instance = new SimpleDateFormat(DateUtils.YYYY_MM_DD);
        instance.setLenient(false);
    }

    EPNDateFormat(String regex) {
        instance = new SimpleDateFormat(regex);
        instance.setLenient(false);
    }

    synchronized String format(Date date) {
        if (date == null) {
            return "";
        }
        return instance.format(date);
    }

    synchronized Date parse(String source) throws ParseException {
        return instance.parse(source);
    }
}

